问题点:串行化,系统"打开"对话框与自制的区别?

来源:百度知道 编辑:UC知道 时间:2024/05/26 13:36:19
(声明:孙鑫视频13课,看过的朋友更容易理解一点)目的:用自己定义的串行化类CGraph去画图,并可通过"自制"的保存与打开对话框像系统提供的一样正常工作.
void CCARView::OnOpen()
{
CFileDialog FileOpen(true);
FileOpen.m_ofn.lpstrTitle="我的打开对话框";
FileOpen.m_ofn.lpstrFilter="TextFile(*.txt)\0*.txt\0AllFile(*.*)\0*.*\0\0"; //设置打开模式
FileOpen.m_ofn.lpstrDefExt="txt";
if(IDOK==FileOpen.DoModal()) //点击确定时
{
CCARDoc* pDoc=CCARView::GetDocument(); //因为是在VIEW类中,故先获得DOC类的指针
CFile File(FileOpen.GetFileName(),CFile::modeRead); //定义CFILE对象
pDoc->DeleteContents(); //打开文档前先删除先前的数据
CArchive ar(&File,CArchive::load); //自定义一个CArchive对象
ar.m_pDocument=pDoc; //关联DOC类的指针
pDoc->Serialize(ar); //调用串行化函数
Invalidate(); //留意这步,问题所在!!
}
}

//文档类的串行化函数
void C

invalidate的中文意思是使无效.也就是说本来MFC已经有一个打开文件的消息响应函数了,你又写了一个,冲突呗.就象你的操作系统中同时装两个杀素软件一样!而系统的打开当然不需要加invalidate了.因为你没加代码.它只有一个消息响应函数.
HOHO我只学了孙鑫的5课.正在学习中!你快出新手村了.好羡慕呀!
----------
使显示在设计图面上的控件的整个区域无效,并向控件设计器发送重新绘制控件的信号。

Visual C++
public:
void Invalidate()

备注
若要使控件设计器能够处理 paint 事件,请在 Initialize 方法中使用 SetViewFlags 方法。

Invalidate 方法为设计宿主提供了指示控件设计器重新绘制控件的方法。实质上这与调用 UpdateDesignTimeHtml 方法相同,因为它导致整个控件被重新绘制。
--------------
Invalidate能产生一个WM_PAINT消息。如果不加入这个函数,你按打开时,窗口中并没有显示绘图,你得自已刷新,以产生WM_PAINT消息。如:最小化窗口后再还原窗口。
----------
OnDraw是为方便程序员而保留的函数,它不响应WM_PAINT消息,是OnPaint函数响应这个消息。而OnPaint函数里面含用OnDraw语句,最终调用的还是OnDraw函数。而OnDraw函数是虚函数,如果为空,它就调用基类中的OnDraw。
-------
你是如何确定,VC用自已的“打开文件”没有调用OnDraw函数的?VC自已打开文件时,调用的应该是基类中的吧!你在子类中的OnDraw处加入断点,能看到什么!